/*
 * Imprimir.java
 *
 * Created on 15 de abril de 2007, 12:44 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package administrador;
import java.awt.*;
import java.awt.print.*;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.RoundingMode;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Date;
import java.util.StringTokenizer;
import javax.print.*;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;

/**
 *
 * @author daniel1
 */
public class Imprimir {

    Archivo facturaTXT;
    String archNom;
    String num_Fact;
    //Datos del Cliente:
    String ClienteRucCI = "";
    String ClienteNom = "";
    String ClienteTlf = "";
    String ClienteDir = "";
    //Tipo de Documento:
    String documento;
    //Informacion de la Empresa
    String NombreRS = "";
    String RucEmisor = "";
    String DireccionLocal = "";
    String AutSRI = "";
    String FechaCaducidad = "";
    String NombreDueno = "";
    String codEmpresa = "";
    String codTerminale = "";


    String texto="";

    //Instancio
    pedidoReposicion pedR;

    /** Creates a new instance of Imprimir */
    public Imprimir(String numFact, String ClienteRucCI, String ClienteNom, String ClienteTlf, String ClienteDir, String documento) {
    }
    NumberFormat nf = NumberFormat.getNumberInstance();
    DecimalFormat dec=(DecimalFormat)nf;
    public Imprimir(String codEmpresa, String codTerminale, String numFact, String ClienteRucCI, String ClienteNom, String ClienteTlf, String ClienteDir, String documento, String NombreRS, String NombreDueno, String RucEmisor, String DireccionLocal, String AutSRI, String FechaCaducidad) {
        //Defino tipo de Documento:
            dec.applyPattern("###.##");
    nf.setMaximumFractionDigits(2);
        nf.setRoundingMode(RoundingMode.HALF_UP);
        
        this.documento = documento;

        //Defino Parametros Factura y Datos del Cliente
        this.ClienteRucCI = ClienteRucCI;
        this.ClienteNom = ClienteNom;
        this.ClienteTlf = ClienteTlf;
        this.ClienteDir = ClienteDir;

        this.num_Fact = numFact;

        //Informacion de la  empresa
        this.NombreRS = "   " + NombreRS + "\n" +
                "    " + NombreDueno + "    ";
        this.RucEmisor = RucEmisor;
        this.DireccionLocal = DireccionLocal;
        this.AutSRI = AutSRI;
        this.FechaCaducidad = FechaCaducidad;
        this.NombreDueno = NombreDueno;
        this.codEmpresa = codEmpresa;
        this.codTerminale = codTerminale;
        //Defino el archivo e inserto la cabecera de la Factura a Imprimir:
        facturaTXT = new Archivo();
        archNom = "facturas/" + documento + "_" + numFact + ".txt";
        facturaTXT.crearArchivo(archNom);
        facturaTXT.escriboLineaArchivo(archNom, cabeceraFactura());
        texto=texto+cabeceraFactura();

    }
    
    public Imprimir(){
    
    
    }
    public Imprimir(pedidoReposicion pedREnt,String numFact){
    pedR=pedREnt;
     facturaTXT = new Archivo();
        archNom = "facturas/reposicion_" + numFact + ".txt";
        facturaTXT.crearArchivo(archNom);

    }

    public void insertoDetImp(String codigoPro, String NombreImp, String cantProVendido, String precio, String subTot) {
        //Inserto en el archivo para la impresion:----------
        String tab1 = " ";
        if (NombreImp.length() > 21) {
            NombreImp = NombreImp.substring(0, 20);
        }
        if (NombreImp.length() > 5 && NombreImp.length() <= 10) {
            tab1 = "\t";
        } else if (NombreImp.length() < 5) {
            tab1 = "\t";
        }



        String tab2 = " ";
        if (codigoPro.length() <= 5) {
            tab2 = "\t";

        } else {
            tab2 = " ";
            tab1 = "";
        }
        String detalleImp = codigoPro + tab2 + "|" +  NombreImp + tab1 + " |# " + cantProVendido + " |$ " + precio + " |$ " + subTot;
        escriboFactReposicion(detalleImp);
    }

    boolean bandera=false;
    public void escriboFactReposicion(String dataIns) {

        if(bandera){
        bandera=false;
        }else{
        bandera=true;
        }

        System.out.println("Los datos a escribir son:" + dataIns);
        facturaTXT.escriboLineaArchivo(archNom, dataIns);

        if(bandera){
        texto=texto+dataIns+"\n";}
        else{
        texto=texto+dataIns+"\n";
        }
    }

    public void escriboFact(String dataIns) {
        System.out.println("Los datos a escribir son:" + dataIns);
        facturaTXT.escriboLineaArchivo(archNom, dataIns);
        texto=texto+dataIns+"\n";
    }

    public void realizaImprecion() {


        try {
            DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
            PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
            PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);

            PrintService service = printService[this.sacoImpresora(printService)];

            // Open the image file
            InputStream is = new BufferedInputStream(new FileInputStream(archNom));
            // Create the print job
            DocPrintJob job = service.createPrintJob();
            DocAttributeSet das = new HashDocAttributeSet();
            Doc doc = new SimpleDoc(is, flavor, das);

            // Monitor print job events
            PrintJobWatcher pjDone = new PrintJobWatcher(job);

            // Print it
            job.print(doc, pras);

            // Wait for the print job to be done
            pjDone.waitForDone();

            // It is now safe to close the input stream
            is.close();
        } catch (PrintException e) {
        } catch (IOException e) {
        }
    }
    public void realizaReImprecion(String path) {


        try {
            DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
            PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
            PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);

            PrintService service = printService[this.sacoImpresora(printService)];

            // Open the image file
            InputStream is = new BufferedInputStream(new FileInputStream(path));
            // Create the print job
            DocPrintJob job = service.createPrintJob();
            DocAttributeSet das = new HashDocAttributeSet();
            Doc doc = new SimpleDoc(is, flavor, das);



            // Monitor print job events
            PrintJobWatcher pjDone = new PrintJobWatcher(job);






            // Print it
            job.print(doc, pras);

            // Wait for the print job to be done
            pjDone.waitForDone();

            // It is now safe to close the input stream
            is.close();
        } catch (PrintException e) {
        } catch (IOException e) {
        }
    }



    public static void printString(final String text) {
        PageFormat pageFormat = new PageFormat();
        PrinterJob printerJob = PrinterJob.getPrinterJob();
        printerJob.setPrintable(new Printable() {

            public int print(Graphics graphics, PageFormat pageFormat,
                    int pageIndex) {
                Graphics2D graphics2D = (Graphics2D) graphics;
                graphics2D.translate(pageFormat.getImageableX(),
                        pageFormat.getImageableY());
                StringTokenizer stringTokenizer = new StringTokenizer(text, "\n\r");
                Font font = new Font("Serif", Font.PLAIN, 10);
                graphics2D.setFont(font);
                int pageWidth = graphics2D.getClipBounds().width;
                FontMetrics fontMetrics =
                        graphics2D.getFontMetrics(font);
                int position = fontMetrics.getHeight();
                int height = fontMetrics.getAscent();
                while (stringTokenizer.hasMoreTokens()) {
                    String line = stringTokenizer.nextToken().trim();
                    int lineWidth = fontMetrics.stringWidth(line);
                    while (lineWidth > pageWidth) {
                        String lineCopy = line;
                        String firstPart = "";
                        while (lineWidth > pageWidth) {
                            int index = lineCopy.lastIndexOf(' ');
                            firstPart = lineCopy.substring(0, index);
                            lineWidth =
                                    fontMetrics.stringWidth(firstPart);
                            lineCopy = firstPart;
                        }
                        graphics2D.drawString(firstPart, 0, position);
                        position += height;
                        line = line.substring(firstPart.length(),
                                line.length()).trim();
                        lineWidth = fontMetrics.stringWidth(line);
                    }
                    graphics2D.drawString(line, 0, position);
                    position += height;
                }
                return (pageIndex == 0 ? PAGE_EXISTS : NO_SUCH_PAGE);
            }
        }, pageFormat);
        if (printerJob.printDialog()) {
            try {
                printerJob.print();
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }
       
    }





public int sacoImpresora(PrintService Impresoras[]) {
        //Busco la Impresora:
        int NumImp = 0;
        int numb = 0;
        while (numb < Impresoras.length) {
            System.out.println("El numero de impresora es:"+numb+" de "+Impresoras[numb].getName().toString());
            if (Impresoras[numb].getName().toString().startsWith("Epson LX")) {
                NumImp = numb;
                System.out.println("La impresora seleccionada es:"+NumImp);
                break;
            }
            numb++;
        }
       
        return NumImp;
    }

    public String cabeceraFactura() {
        Date now = new Date();
        //Defino la Cabeceras:
        //*********************Cabecera de Factura******************************
        String cabecera;
        String DenominacionDoc = "*";

        System.out.println("El Documento a Imprimir es: " + documento);
        if (documento.equals("Factura")) {
            DenominacionDoc = "   FACTURA DE RETIRO DE MERCADERIA   ";
        }
        if (documento.equals("Nota de Venta")) {
            DenominacionDoc = "NOTA DE VENTA";
        }
        if (documento.equals("Nota de Debito")) {
            DenominacionDoc = "NOTA DE DEBITO";
        }
        if (documento.equals("Nota de Credito")) {
            DenominacionDoc = "NOTA DE CREDITO";
        }
        if (documento.equals("Factura de Compras")) {
            DenominacionDoc = "FACTURA DE COMPRAS";
        }
        if (documento.equals("Devolucion en Compras")) {
            DenominacionDoc = "DEVOLUCION EN COMPRAS";
        }
        //genero los numeros de factura
        int contador = num_Fact.length();
        contador = 7 - contador;
        for (int i = 0; i < contador; i++) {
            num_Fact = "0" + num_Fact;
        }

        int contadorNE = codEmpresa.length();
        contadorNE = 3 - contadorNE;
        for (int i = 0; i < contadorNE; i++) {
            codEmpresa = "0" + codEmpresa;
        }

        int contadorNT = codTerminale.length();
        contadorNT = 3 - contadorNT;
        for (int i = 0; i < contadorNT; i++) {
            codTerminale = "0" + codTerminale;
        }
        //String codEmpresa,String codTerminale
        //String NumFactura="001-001-"+num_Fact;
        String NumFactura = codEmpresa + "-" + codTerminale + "-" + num_Fact;
        cabecera =
                "" + DenominacionDoc + "\n" +
                "" + NombreRS + "\n_\n" +
                //"          Ruc:" + RucEmisor + "\n" +
                //"  "+DireccionLocal + "\n" +
                //"  AutSRI:" + AutSRI + " F.CAD:" + FechaCaducidad + "\n" +
                "" +"\n" +
                "           No.:" + NumFactura + "\n\n";

        //Datos del Cliente:

        String Fecha = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(now);
        // String FormaPago="Contado";
        cabecera = cabecera +
                "Datos del Cliente:\n_\n " +
                "Ruc/CI:" + ClienteRucCI + "  \nTlf:" + ClienteTlf + "\n" +
                "Nom:" + ClienteNom + "\n" +
                "Dir:" + ClienteDir + "\n\n" +
                Fecha + " " + "\n_";
        //############################
        
        
        return cabecera;
    }
    
    public String pongoTitulos(String facturaTXT){
        facturaTXT = facturaTXT +
                "\n===================================\n" +
                "Item              Nombre              Cant  Prec  Sub\n" +
                "=====================================\n";
       return facturaTXT;
    }
    
    
    public String pieFactura(String Subtotal, String Descuento, String Iva, String total) {
        String Pie = "";
        double Sub_Desc = Double.parseDouble(Subtotal) - Double.parseDouble(Descuento);
        if (documento.equals("Factura")||documento.equals("FactxMayor")) {
            Pie = "=====================================\n_\n" +
                    "Subtotal   =" + Subtotal + "\n\n" +
                    "Descuento  =" + Descuento + "\n" +
                    "Sub-Desc  =" + nf.format(Sub_Desc).replaceAll(",",".") + "\n" +
                    "Iva        =" + Iva + "\n_\n" +
                    "TOTAL PAG  =" + total+"\n";
        }
        if (documento.equals("Nota de Venta")) {
            Pie = "=====================================\n\n" +
                    "Descuento  =" + Descuento + "\n" +
                    "TOTAL PAG  =" + total;
        }
        if (documento.equals("Nota de Debito")) {
            Pie = "=====================================\n" +
                    "Subtotal   =" + Subtotal + "\n" +
                    "Iva        =" + Iva + "\n" +
                    "TOTAL PAG  =" + total;
        }
        if (documento.equals("Nota de Credito")) {
            Pie = "=====================================\n" +
                    "Subtotal   =" + Subtotal + "\n" +
                    "Iva        =" + Iva + "\n" +
                    "TOTAL PAG  =" + total;
        }
        if (documento.equals("Factura de Compras")) {
            Pie = "=====================================\n" +
                    "Subtotal   =" + Subtotal + "\n" +
                    "Descuento  =" + Descuento + "\n" +
                    "Sub-Desc  =" + nf.format(Sub_Desc).replaceAll(",",".") + "\n" +
                    "Iva        =" + Iva + "\n" +
                    "TOTAL PAG  =" + total;
        }
        if (documento.equals("Devolucion en Compras")) {
            Pie = "=====================================\n" +
                    "Subtotal   =" + Subtotal + "\n" +
                    "Descuento  =" + Descuento + "\n" +
                    "Iva        =" + Iva + "\n" +
                    "TOTAL PAG  =" + total;
        }
        return Pie;
    }

    public Archivo getArchivo() {
        return facturaTXT;
    }

    public void setArchivo(Archivo archivocp) {
        facturaTXT = archivocp;
    }
}


